<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/stop_machine.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/stop_machine.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_noref.html#_X0xJTlVYX1NUT1BfTUFDSElORV8w"><span class="b">_LINUX_STOP_MACHINE</span></a>
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_X0xJTlVYX1NUT1BfTUFDSElORV8w"><span class="b">_LINUX_STOP_MACHINE</span></a>
<a name="3" /><span class="True">       3:</span> 
<a name="4" /><span class="True">       4:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">cpu</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="5" /><span class="True">       5:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">cpumask</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="6" /><span class="True">       6:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">smp</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="7" /><span class="True">       7:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">list</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="8" /><span class="True">       8:</span> 
<a name="9" /><span class="True">       9:</span> <span class="k">/*</span>
<a name="10" /><span class="True">      10:</span> <span class="k"> * stop_cpu[s]() is simplistic per-cpu maximum priority cpu</span>
<a name="11" /><span class="True">      11:</span> <span class="k"> * monopolization mechanism.  The caller can specify a non-sleeping</span>
<a name="12" /><span class="True">      12:</span> <span class="k"> * function to be executed on a single or multiple cpus preempting all</span>
<a name="13" /><span class="True">      13:</span> <span class="k"> * other processes and monopolizing those cpus until it finishes.</span>
<a name="14" /><span class="True">      14:</span> <span class="k"> *</span>
<a name="15" /><span class="True">      15:</span> <span class="k"> * Resources for this mechanism are preallocated when a cpu is brought</span>
<a name="16" /><span class="True">      16:</span> <span class="k"> * up and requests are guaranteed to be served as long as the target</span>
<a name="17" /><span class="True">      17:</span> <span class="k"> * cpus are online.</span>
<a name="18" /><span class="True">      18:</span> <span class="k"> */</span>
<a name="19" /><span class="True">      19:</span> <span class="m">typedef</span> <span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">cpu_stop_fn_t</span><span class="f">)</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="b">arg</span><span class="f">)</span><span class="f">;</span>
<a name="20" /><span class="True">      20:</span> 
<a name="21" /><span class="True">      21:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a>
<a name="22" /><span class="True">      22:</span> 
<a name="23" /><span class="True">      23:</span> <span class="m">struct</span> <span class="b">cpu_stop_work</span> <span class="f">{</span>
<a name="24" /><span class="True">      24:</span>     <span class="m">struct</span> <span class="b">list_head</span>    <span class="b">list</span><span class="f">;</span>        <span class="k">/* cpu_stopper-&gt;works */</span>
<a name="25" /><span class="True">      25:</span>     <span class="b">cpu_stop_fn_t</span>        <span class="b">fn</span><span class="f">;</span>
<a name="26" /><span class="True">      26:</span>     <span class="m">void</span>            <span class="f">*</span><span class="b">arg</span><span class="f">;</span>
<a name="27" /><span class="True">      27:</span>     <span class="m">struct</span> <span class="b">cpu_stop_done</span>    <span class="f">*</span><span class="b">done</span><span class="f">;</span>
<a name="28" /><span class="True">      28:</span> <span class="f">}</span><span class="f">;</span>
<a name="29" /><span class="True">      29:</span> 
<a name="30" /><span class="True">      30:</span> <span class="m">int</span> <span class="b">stop_one_cpu</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu</span><span class="f">,</span> <span class="b">cpu_stop_fn_t</span> <span class="b">fn</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">arg</span><span class="f">)</span><span class="f">;</span>
<a name="31" /><span class="True">      31:</span> <span class="m">int</span> <span class="b">stop_two_cpus</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu1</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu2</span><span class="f">,</span> <span class="b">cpu_stop_fn_t</span> <span class="b">fn</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">arg</span><span class="f">)</span><span class="f">;</span>
<a name="32" /><span class="True">      32:</span> <span class="m">void</span> <span class="b">stop_one_cpu_nowait</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu</span><span class="f">,</span> <span class="b">cpu_stop_fn_t</span> <span class="b">fn</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">arg</span><span class="f">,</span>
<a name="33" /><span class="True">      33:</span>              <span class="m">struct</span> <span class="b">cpu_stop_work</span> <span class="f">*</span><span class="b">work_buf</span><span class="f">)</span><span class="f">;</span>
<a name="34" /><span class="True">      34:</span> <span class="m">int</span> <span class="b">stop_cpus</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpumask</span><span class="f">,</span> <span class="b">cpu_stop_fn_t</span> <span class="b">fn</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">arg</span><span class="f">)</span><span class="f">;</span>
<a name="35" /><span class="True">      35:</span> <span class="m">int</span> <span class="b">try_stop_cpus</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpumask</span><span class="f">,</span> <span class="b">cpu_stop_fn_t</span> <span class="b">fn</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">arg</span><span class="f">)</span><span class="f">;</span>
<a name="36" /><span class="True">      36:</span> 
<a name="37" /><span class="False">      37:</span> <span class="f">#</span><span class="n">else</span>    <span class="k">/* CONFIG_SMP */</span>
<a name="38" /><span class="False">      38:</span> 
<a name="39" /><span class="False">      39:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">workqueue</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="40" /><span class="False">      40:</span> 
<a name="41" /><span class="False">      41:</span> <span class="m">struct</span> <span class="b">cpu_stop_work</span> <span class="f">{</span>
<a name="42" /><span class="False">      42:</span>     <span class="m">struct</span> <span class="b">work_struct</span>    <span class="b">work</span><span class="f">;</span>
<a name="43" /><span class="False">      43:</span>     <span class="b">cpu_stop_fn_t</span>        <span class="b">fn</span><span class="f">;</span>
<a name="44" /><span class="False">      44:</span>     <span class="m">void</span>            <span class="f">*</span><span class="b">arg</span><span class="f">;</span>
<a name="45" /><span class="False">      45:</span> <span class="f">}</span><span class="f">;</span>
<a name="46" /><span class="False">      46:</span> 
<a name="47" /><span class="False">      47:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">stop_one_cpu</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu</span><span class="f">,</span> <span class="b">cpu_stop_fn_t</span> <span class="b">fn</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">arg</span><span class="f">)</span>
<a name="48" /><span class="False">      48:</span> <span class="f">{</span>
<a name="49" /><span class="False">      49:</span>     <span class="m">int</span> <span class="b">ret</span> <span class="f">=</span> <span class="f">-</span><a href="cpu.c_macros_noref.html#_RU5PRU5UXzA_"><span class="b">ENOENT</span></a><span class="f">;</span>
<a name="50" /><span class="False">      50:</span>     <a href="cpu.c_macros_ref.html#_cHJlZW1wdF9kaXNhYmxlXzA_"><span class="b">preempt_disable</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="51" /><span class="False">      51:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">cpu</span> <span class="f">==</span> <a href="cpu.c_macros_noref.html#_c21wX3Byb2Nlc3Nvcl9pZF8w"><span class="b">smp_processor_id</span></a><span class="f">(</span><span class="f">)</span><span class="f">)</span>
<a name="52" /><span class="False">      52:</span>         <span class="b">ret</span> <span class="f">=</span> <span class="b">fn</span><span class="f">(</span><span class="b">arg</span><span class="f">)</span><span class="f">;</span>
<a name="53" /><span class="False">      53:</span>     <a href="cpu.c_macros_ref.html#_cHJlZW1wdF9lbmFibGVfMA__"><span class="b">preempt_enable</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="54" /><span class="False">      54:</span>     <span class="m">return</span> <span class="b">ret</span><span class="f">;</span>
<a name="55" /><span class="False">      55:</span> <span class="f">}</span>
<a name="56" /><span class="False">      56:</span> 
<a name="57" /><span class="False">      57:</span> <span class="m">static</span> <span class="m">void</span> <span class="b">stop_one_cpu_nowait_workfn</span><span class="f">(</span><span class="m">struct</span> <span class="b">work_struct</span> <span class="f">*</span><span class="b">work</span><span class="f">)</span>
<a name="58" /><span class="False">      58:</span> <span class="f">{</span>
<a name="59" /><span class="False">      59:</span>     <span class="m">struct</span> <span class="b">cpu_stop_work</span> <span class="f">*</span><span class="b">stwork</span> <span class="f">=</span>
<a name="60" /><span class="False">      60:</span>         <a href="cpu.c_macros_ref.html#_Y29udGFpbmVyX29mXzA_"><span class="b">container_of</span></a><span class="f">(</span><span class="b">work</span><span class="f">,</span> <span class="m">struct</span> <span class="b">cpu_stop_work</span><span class="f">,</span> <span class="b">work</span><span class="f">)</span><span class="f">;</span>
<a name="61" /><span class="False">      61:</span>     <a href="cpu.c_macros_ref.html#_cHJlZW1wdF9kaXNhYmxlXzA_"><span class="b">preempt_disable</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="62" /><span class="False">      62:</span>     <span class="b">stwork</span><span class="f">-&gt;</span><span class="b">fn</span><span class="f">(</span><span class="b">stwork</span><span class="f">-&gt;</span><span class="b">arg</span><span class="f">)</span><span class="f">;</span>
<a name="63" /><span class="False">      63:</span>     <a href="cpu.c_macros_ref.html#_cHJlZW1wdF9lbmFibGVfMA__"><span class="b">preempt_enable</span></a><span class="f">(</span><span class="f">)</span><span class="f">;</span>
<a name="64" /><span class="False">      64:</span> <span class="f">}</span>
<a name="65" /><span class="False">      65:</span> 
<a name="66" /><span class="False">      66:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">stop_one_cpu_nowait</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">int</span> <span class="b">cpu</span><span class="f">,</span>
<a name="67" /><span class="False">      67:</span>                        <span class="b">cpu_stop_fn_t</span> <span class="b">fn</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">arg</span><span class="f">,</span>
<a name="68" /><span class="False">      68:</span>                        <span class="m">struct</span> <span class="b">cpu_stop_work</span> <span class="f">*</span><span class="b">work_buf</span><span class="f">)</span>
<a name="69" /><span class="False">      69:</span> <span class="f">{</span>
<a name="70" /><span class="False">      70:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">cpu</span> <span class="f">==</span> <a href="cpu.c_macros_noref.html#_c21wX3Byb2Nlc3Nvcl9pZF8w"><span class="b">smp_processor_id</span></a><span class="f">(</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>
<a name="71" /><span class="False">      71:</span>         <a href="cpu.c_macros_noref.html#_SU5JVF9XT1JLXzA_"><span class="b">INIT_WORK</span></a><span class="f">(</span><span class="f">&amp;</span><span class="b">work_buf</span><span class="f">-&gt;</span><span class="b">work</span><span class="f">,</span> <span class="b">stop_one_cpu_nowait_workfn</span><span class="f">)</span><span class="f">;</span>
<a name="72" /><span class="False">      72:</span>         <span class="b">work_buf</span><span class="f">-&gt;</span><span class="b">fn</span> <span class="f">=</span> <span class="b">fn</span><span class="f">;</span>
<a name="73" /><span class="False">      73:</span>         <span class="b">work_buf</span><span class="f">-&gt;</span><span class="b">arg</span> <span class="f">=</span> <span class="b">arg</span><span class="f">;</span>
<a name="74" /><span class="False">      74:</span>         <span class="b">schedule_work</span><span class="f">(</span><span class="f">&amp;</span><span class="b">work_buf</span><span class="f">-&gt;</span><span class="b">work</span><span class="f">)</span><span class="f">;</span>
<a name="75" /><span class="False">      75:</span>     <span class="f">}</span>
<a name="76" /><span class="False">      76:</span> <span class="f">}</span>
<a name="77" /><span class="False">      77:</span> 
<a name="78" /><span class="False">      78:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">stop_cpus</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpumask</span><span class="f">,</span>
<a name="79" /><span class="False">      79:</span>                 <span class="b">cpu_stop_fn_t</span> <span class="b">fn</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">arg</span><span class="f">)</span>
<a name="80" /><span class="False">      80:</span> <span class="f">{</span>
<a name="81" /><span class="False">      81:</span>     <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_Y3B1bWFza190ZXN0X2NwdV8w"><span class="b">cpumask_test_cpu</span></a><span class="f">(</span><a href="cpu.c_macros_noref.html#_cmF3X3NtcF9wcm9jZXNzb3JfaWRfMA__"><span class="b">raw_smp_processor_id</span></a><span class="f">(</span><span class="f">)</span><span class="f">,</span> <span class="b">cpumask</span><span class="f">)</span><span class="f">)</span>
<a name="82" /><span class="False">      82:</span>         <span class="m">return</span> <span class="b">stop_one_cpu</span><span class="f">(</span><a href="cpu.c_macros_noref.html#_cmF3X3NtcF9wcm9jZXNzb3JfaWRfMA__"><span class="b">raw_smp_processor_id</span></a><span class="f">(</span><span class="f">)</span><span class="f">,</span> <span class="b">fn</span><span class="f">,</span> <span class="b">arg</span><span class="f">)</span><span class="f">;</span>
<a name="83" /><span class="False">      83:</span>     <span class="m">return</span> <span class="f">-</span><a href="cpu.c_macros_noref.html#_RU5PRU5UXzA_"><span class="b">ENOENT</span></a><span class="f">;</span>
<a name="84" /><span class="False">      84:</span> <span class="f">}</span>
<a name="85" /><span class="False">      85:</span> 
<a name="86" /><span class="False">      86:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">try_stop_cpus</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpumask</span><span class="f">,</span>
<a name="87" /><span class="False">      87:</span>                 <span class="b">cpu_stop_fn_t</span> <span class="b">fn</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">arg</span><span class="f">)</span>
<a name="88" /><span class="False">      88:</span> <span class="f">{</span>
<a name="89" /><span class="False">      89:</span>     <span class="m">return</span> <span class="b">stop_cpus</span><span class="f">(</span><span class="b">cpumask</span><span class="f">,</span> <span class="b">fn</span><span class="f">,</span> <span class="b">arg</span><span class="f">)</span><span class="f">;</span>
<a name="90" /><span class="False">      90:</span> <span class="f">}</span>
<a name="91" /><span class="False">      91:</span> 
<a name="92" /><span class="True">      92:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* CONFIG_SMP */</span>
<a name="93" /><span class="True">      93:</span> 
<a name="94" /><span class="True">      94:</span> <span class="k">/*</span>
<a name="95" /><span class="True">      95:</span> <span class="k"> * stop_machine &quot;Bogolock&quot;: stop the entire machine, disable</span>
<a name="96" /><span class="True">      96:</span> <span class="k"> * interrupts.  This is a very heavy lock, which is equivalent to</span>
<a name="97" /><span class="True">      97:</span> <span class="k"> * grabbing every spinlock (and more).  So the &quot;read&quot; side to such a</span>
<a name="98" /><span class="True">      98:</span> <span class="k"> * lock is anything which disables preemption.</span>
<a name="99" /><span class="True">      99:</span> <span class="k"> */</span>
<a name="100" /><span class="True">     100:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1NUT1BfTUFDSElORV8w"><span class="b">CONFIG_STOP_MACHINE</span></a><span class="f">)</span> <span class="f">&amp;&amp;</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a><span class="f">)</span>
<a name="101" /><span class="True">     101:</span> 
<a name="102" /><span class="True">     102:</span> <span class="k">/**</span>
<a name="103" /><span class="True">     103:</span> <span class="k"> * stop_machine: freeze the machine on all CPUs and run this function</span>
<a name="104" /><span class="True">     104:</span> <span class="k"> * @fn: the function to run</span>
<a name="105" /><span class="True">     105:</span> <span class="k"> * @data: the data ptr for the @fn()</span>
<a name="106" /><span class="True">     106:</span> <span class="k"> * @cpus: the cpus to run the @fn() on (NULL = any online cpu)</span>
<a name="107" /><span class="True">     107:</span> <span class="k"> *</span>
<a name="108" /><span class="True">     108:</span> <span class="k"> * Description: This causes a thread to be scheduled on every cpu,</span>
<a name="109" /><span class="True">     109:</span> <span class="k"> * each of which disables interrupts.  The result is that no one is</span>
<a name="110" /><span class="True">     110:</span> <span class="k"> * holding a spinlock or inside any other preempt-disabled region when</span>
<a name="111" /><span class="True">     111:</span> <span class="k"> * @fn() runs.</span>
<a name="112" /><span class="True">     112:</span> <span class="k"> *</span>
<a name="113" /><span class="True">     113:</span> <span class="k"> * This can be thought of as a very heavy write lock, equivalent to</span>
<a name="114" /><span class="True">     114:</span> <span class="k"> * grabbing every spinlock in the kernel. */</span>
<a name="115" /><span class="True">     115:</span> <span class="m">int</span> <span class="b">stop_machine</span><span class="f">(</span><span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">fn</span><span class="f">)</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">,</span> <span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpus</span><span class="f">)</span><span class="f">;</span>
<a name="116" /><span class="True">     116:</span> 
<a name="117" /><span class="True">     117:</span> <span class="k">/**</span>
<a name="118" /><span class="True">     118:</span> <span class="k"> * __stop_machine: freeze the machine on all CPUs and run this function</span>
<a name="119" /><span class="True">     119:</span> <span class="k"> * @fn: the function to run</span>
<a name="120" /><span class="True">     120:</span> <span class="k"> * @data: the data ptr for the @fn</span>
<a name="121" /><span class="True">     121:</span> <span class="k"> * @cpus: the cpus to run the @fn() on (NULL = any online cpu)</span>
<a name="122" /><span class="True">     122:</span> <span class="k"> *</span>
<a name="123" /><span class="True">     123:</span> <span class="k"> * Description: This is a special version of the above, which assumes cpus</span>
<a name="124" /><span class="True">     124:</span> <span class="k"> * won&apos;t come or go while it&apos;s being called.  Used by hotplug cpu.</span>
<a name="125" /><span class="True">     125:</span> <span class="k"> */</span>
<a name="126" /><span class="True">     126:</span> <span class="m">int</span> <span class="b">__stop_machine</span><span class="f">(</span><span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">fn</span><span class="f">)</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">,</span> <span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpus</span><span class="f">)</span><span class="f">;</span>
<a name="127" /><span class="True">     127:</span> 
<a name="128" /><span class="True">     128:</span> <span class="m">int</span> <span class="b">stop_machine_from_inactive_cpu</span><span class="f">(</span><span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">fn</span><span class="f">)</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">,</span>
<a name="129" /><span class="True">     129:</span>                    <span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpus</span><span class="f">)</span><span class="f">;</span>
<a name="130" /><span class="True">     130:</span> 
<a name="131" /><span class="False">     131:</span> <span class="f">#</span><span class="n">else</span>     <span class="k">/* CONFIG_STOP_MACHINE &amp;&amp; CONFIG_SMP */</span>
<a name="132" /><span class="False">     132:</span> 
<a name="133" /><span class="False">     133:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">__stop_machine</span><span class="f">(</span><span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">fn</span><span class="f">)</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">,</span>
<a name="134" /><span class="False">     134:</span>                  <span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpus</span><span class="f">)</span>
<a name="135" /><span class="False">     135:</span> <span class="f">{</span>
<a name="136" /><span class="False">     136:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">flags</span><span class="f">;</span>
<a name="137" /><span class="False">     137:</span>     <span class="m">int</span> <span class="b">ret</span><span class="f">;</span>
<a name="138" /><span class="False">     138:</span>     <a href="cpu.c_macros_ref.html#_bG9jYWxfaXJxX3NhdmVfMA__"><span class="b">local_irq_save</span></a><span class="f">(</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="139" /><span class="False">     139:</span>     <span class="b">ret</span> <span class="f">=</span> <span class="b">fn</span><span class="f">(</span><span class="b">data</span><span class="f">)</span><span class="f">;</span>
<a name="140" /><span class="False">     140:</span>     <a href="cpu.c_macros_ref.html#_bG9jYWxfaXJxX3Jlc3RvcmVfMA__"><span class="b">local_irq_restore</span></a><span class="f">(</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="141" /><span class="False">     141:</span>     <span class="m">return</span> <span class="b">ret</span><span class="f">;</span>
<a name="142" /><span class="False">     142:</span> <span class="f">}</span>
<a name="143" /><span class="False">     143:</span> 
<a name="144" /><span class="False">     144:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">stop_machine</span><span class="f">(</span><span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">fn</span><span class="f">)</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">,</span>
<a name="145" /><span class="False">     145:</span>                    <span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpus</span><span class="f">)</span>
<a name="146" /><span class="False">     146:</span> <span class="f">{</span>
<a name="147" /><span class="False">     147:</span>     <span class="m">return</span> <span class="b">__stop_machine</span><span class="f">(</span><span class="b">fn</span><span class="f">,</span> <span class="b">data</span><span class="f">,</span> <span class="b">cpus</span><span class="f">)</span><span class="f">;</span>
<a name="148" /><span class="False">     148:</span> <span class="f">}</span>
<a name="149" /><span class="False">     149:</span> 
<a name="150" /><span class="False">     150:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">stop_machine_from_inactive_cpu</span><span class="f">(</span><span class="m">int</span> <span class="f">(</span><span class="f">*</span><span class="b">fn</span><span class="f">)</span><span class="f">(</span><span class="m">void</span> <span class="f">*</span><span class="f">)</span><span class="f">,</span> <span class="m">void</span> <span class="f">*</span><span class="b">data</span><span class="f">,</span>
<a name="151" /><span class="False">     151:</span>                          <span class="m">const</span> <span class="m">struct</span> <span class="b">cpumask</span> <span class="f">*</span><span class="b">cpus</span><span class="f">)</span>
<a name="152" /><span class="False">     152:</span> <span class="f">{</span>
<a name="153" /><span class="False">     153:</span>     <span class="m">return</span> <span class="b">__stop_machine</span><span class="f">(</span><span class="b">fn</span><span class="f">,</span> <span class="b">data</span><span class="f">,</span> <span class="b">cpus</span><span class="f">)</span><span class="f">;</span>
<a name="154" /><span class="False">     154:</span> <span class="f">}</span>
<a name="155" /><span class="False">     155:</span> 
<a name="156" /><span class="True">     156:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* CONFIG_STOP_MACHINE &amp;&amp; CONFIG_SMP */</span>
<a name="157" /><span class="True">     157:</span> <span class="f">#</span><span class="n">endif</span>    <span class="k">/* _LINUX_STOP_MACHINE */</span>
<a name="158" /><span class="True">     158:</span> </pre>
  </body>
</html>
